RAPPORT-ATL-4


JSF ?

JSF (JavaServer Faces) est un framework de développement web pour les applications basées sur Java. Il facilite la création d'interfaces utilisateur en offrant des composants prêts à l'emploi pour la création de pages web dynamiques. Il permet également la gestion des états et fournit des mécanismes pour la validation des données et la gestion des erreurs. En utilisant des balises personnalisées, JSF peut encapsuler les composants réutilisables qui peuvent être utilisés sur plusieurs pages et projets.


Architecture JSF ?

L'une des principales avantages de JSF est qu'il est à la fois une norme d'interface utilisateur Web Java et un framework qui suit fermement le modèle de conception Modèle-Vue-Contrôleur (MVC). Cela rend les applications JSF beaucoup plus faciles à gérer car le code de l'interface utilisateur (Vue) est clairement séparé des données et de la logique de l'application (Modèle). Pour préparer le contexte JSF, qui fournit l'accès aux données de l'application aux pages et pour protéger contre l'accès non autorisé ou inapproprié des pages, toutes les interactions de l'utilisateur avec l'application sont gérées par un servlet frontal "Faces" (Contrôleur).


Technologies Utiliser :


Structure de project

├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
    └── main
        ├── java
        │   └── me
        │       └── yasser
        │           └── atelier4
        │               ├── components
        │               │   ├── StudentBeanEJB.java
        │               │   └── StudentEJB.java
        │               ├── controllers
        │               │   └── StudentController.java
        │               ├── entity
        │               │   └── Student.java
        │               └── manager
        │                   └── EntityManagerHelper.java
        ├── resources
        │   ├── log4j2.properties
        │   └── META-INF
        │       ├── beans.xml
        │       └── persistence.xml
        └── webapp
            ├── index.xhtml
            ├── pages
            ├── static
            │   ├── css
            │   │   └── stylesheet.css
            │   ├── images
            │   │   ├── ensalogo.png
            │   │   └── Success.gif
            │   └── js
            │       └── app.js
            ├── success.xhtml
            └── WEB-INF
                ├── faces-config.xml
                └── web.xml


Creation d’entites Student

La classe Studentest une entité JPA qui représente un étudiant et qui sera mappée à une table de base de données.

Dans la classe Student, les annotations @Entity et @Table indiquent à JPA que cette classe est une entité JPA et qu'elle sera mappée à une table de base de données nommée "student" dans le schéma "ATELIER4". Les différentes propriétés de la classe, annotées avec @Column, représentent les colonnes de la table.

L'annotation @Id indique que la propriété id est la clé primaire de la table. L'annotation @GeneratedValue avec GenerationType.IDENTITY spécifie que la valeur de la clé primaire sera générée automatiquement par la base de données.

L'utilisation des annotations @Data, @AllArgsConstructor, @NoArgsConstructor et @ToString permettent de simplifier le code en évitant de répéter du code boilerplate pour la création de constructeurs, de méthodes getter/setter et de méthodes toString().

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Entity
@Table(name="student",schema = "ATELIER4")
public class Student {
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Id
	@Column(name = "id", nullable = false)
	private long id;
	@Basic
	@Column(name = "LastName", nullable = true, length = 20)
	private String LastName;
	@Basic
	@Column(name = "FirstName", nullable = true, length = 20)
	private String FirstName;
	@Basic
	@Column(name = "CIN", nullable = true, length = 20)
	private String CIN;
	@Basic
	@Column(name="BirthDate", nullable = true)
	private Date BirthDate;
	@Basic
	@Column(name="PhoneNumber", nullable = true,length = 255)
	private String PhoneNumber;
	@Basic
	@Column(name="Email", nullable = true,length = 255)
	private String Email;
}

Creationg du bean StudentBeanEJB

La classe StudentBeanEJB est une classe EJB qui implémente l'interface StudentEJB. Elle fournit une implémentation pour les méthodes définies dans cette interface.

L'annotation @Stateless indique que la classe est un EJB Stateless, qui peut être partagé entre plusieurs clients et n'a pas d'état de session.

L'annotation @LocalBean est utilisée pour indiquer que l'EJB n'a pas besoin d'être accédé à distance et peut être accédé localement.

La méthode registerStudent() insère un nouvel objet Student dans la base de données en utilisant l'EntityManager pour persister l'objet. La méthode retourne "success" si l'opération réussit, sinon elle retourne une exception.

La méthode getStudent() utilise l'EntityManager pour rechercher un objet Student dans la base de données en utilisant son identifiant. La méthode retourne l'objet Student correspondant si l'objet est trouvé, sinon elle retourne null.

- Interface

@Remote
public interface StudentEJB {
	// for inserting a student in the database
	String registerStudent(Student std);
	// for getting a student from the database
	Student getStudent(int id);
}

- Main class

@Stateless
@LocalBean
public class StudentBeanEJB implements StudentEJB {
	@PersistenceContext(unitName = "default")
	private static EntityManager em;

	@Override
	public String registerStudent(Student std) {
		em = EntityManagerHelper.getEntityManager();
		System.out.println("! Inserting Data !\n==================================================");
		try{
			em.getTransaction().begin();
			em.persist(std);
			em.getTransaction().commit();
			System.out.println("! Opperation Successful !\n==================================================");
		} catch (Exception e)
		{
//            em.getTransaction().rollback();
			System.out.println("Opperation Unsuccessful");
			System.out.println("Here are some errors that might help\n"+e);
		}
		finally {
			em.close();
		}
		return "success";
	}

	@Override
	public Student getStudent(int id) {
		return em.find(Student.class, id);
	}
}

Creation du Controlleurs

Cette classe StudentController est une classe de contrôleur qui est annotée avec @SessionScoped et @Named. Elle est utilisée pour interagir avec les pages web et les services back-end en utilisant des méthodes définies dans les autres classes de ce projet.

Cette classe possède des champs privés pour stocker les informations de l'étudiant, tels que le nom, le prénom, la date de naissance, le numéro de téléphone et l'adresse e-mail. La méthode DateFormater() utilise la classe DateFormat pour formatter la date de naissance dans le format "dd/MM/yyyy".

La méthode saveStudent() est appelée lorsque l'utilisateur soumet un formulaire de saisie de l'étudiant. Elle crée un nouvel objet Student et définit ses propriétés en utilisant les valeurs des champs de la classe StudentController. Ensuite, elle appelle la méthode registerStudent de la classe StudentBeanEJB pour enregistrer l'étudiant dans la base de données en utilisant JPA. Cette méthode retourne une chaîne de caractères "success" si l'opération est réussie et "failure" si elle échoue.

@SessionScoped
@Named(value = "studentBean")
@Data
@NoArgsConstructor
public class StudentController implements Serializable {
	@EJB
	private StudentBeanEJB stdejb;

	private String LastName;
	private String FirstName;
	private String CIN;
	private Date BirthDate;
	private String PhoneNumber;
	private String Email;

	public String DateFormater() throws ParseException {
		DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
//		Date todayWithZeroTime = formatter.parse(formatter.format(this.BirthDate));
//		System.out.println(formatter.format(this.BirthDate));
//		System.out.println(formatter.parse(formatter.format(this.BirthDate)));
		return formatter.format(this.BirthDate);
	}

	public String saveStudent(){
		Student stds = new Student();
		stds.setFirstName(this.FirstName);
		stds.setLastName(this.LastName);;
		stds.setCIN(this.CIN);
		stds.setBirthDate(this.BirthDate);
		stds.setPhoneNumber(this.PhoneNumber);
		stds.setEmail(this.Email);
		return stdejb.registerStudent(stds);
	}
}

JSF page

<h:form>
        <div class="field-group">
            <h:inputText value="#{studentBean.firstName}" id="firstname" name="firstname" class="input-field"
                         placeholder="First Name" autocomplete="off" required="true"/>
            <h:outputLabel for="firstname" class="input-label">First Name</h:outputLabel>
        </div>
        <div class="field-group">
            <h:inputText value="#{studentBean.lastName}" id="lastname" name="lastname" class="input-field"
                         placeholder="Last Name" autocomplete="off" required="true"/>
            <h:outputLabel for="lastname" class="input-label">Last Name</h:outputLabel>
        </div>
        <div class="field-group">
            <h:inputText value="#{studentBean.email}" id="email" name="email" class="input-field" placeholder="Email"
                         autocomplete="off" required="true"/>
            <h:outputLabel for="email" class="input-label">Email</h:outputLabel>
        </div>
        <div class="field-group">
			....
<h:form>

Success Page

<h:body>
	<div class="field-group">
	         <h:inputText value="#{studentBean.firstName}" id="firstname" name="firstname" class="input-field"
	                      placeholder="First Name" autocomplete="off" disabled="true"/>
	         <h:outputLabel for="firstname" class="input-label">First Name</h:outputLabel>
	      </div>
	      <div class="field-group">
	         <h:inputText value="#{studentBean.lastName}" id="lastname" name="lastname" class="input-field"
	                      placeholder="Last Name" autocomplete="off" disabled="true"/>
	         <h:outputLabel for="lastname" class="input-label">Last Name</h:outputLabel>
	      </div>
.....
<h:body/>

Configuration Files

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
  <persistence-unit name="default">

    <class>me.yasser.atelier4.entity.Student</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:mariadb://localhost:3306/ATELIER4?createDatabaseIfNotExist=true"/>
      <property name="javax.persistence.jdbc.driver" value="org.mariadb.jdbc.Driver"/>
      <property name="javax.persistence.jdbc.user" value="abmola"/>
      <property name="javax.persistence.jdbc.password" value="yasser1234"/>
      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>

      <property name="hibernate.dialect" value="org.hibernate.dialect.MariaDB10Dialect"/>
      <property name="show_sql" value="false"/>
      <property name="format_sql" value="true"/>
      <property name="hbm2ddl.auto" value="create-drop"/>
    </properties>
  </persistence-unit>
</persistence>

le fichier persistence.xml et se trouve dans le répertoire src/main/resources/META-INF. C'est un fichier de configuration pour la persistance des données utilisé par l'API Java Persistence (JPA). Il contient des informations sur la manière dont l'application accède aux données stockées dans une base de données relationnelle.

Les éléments importants de ce fichier incluent :

En somme, ce fichier est utilisé pour configurer la persistance des données dans l'application, y compris la connexion à la base de données, la définition des entités JPA et la configuration d'Hibernate.

faces-config.xml

<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="3.0" xmlns="https://jakarta.ee/xml/ns/jakartaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                                  https://jakarta.ee/xml/ns/jakartaee/web-facesconfig_3_0.xsd">
        <managed-bean>
            <managed-bean-name>studentBean</managed-bean-name>
            <managed-bean-class>me.yasser.atelier4.controllers.StudentController</managed-bean-class>
            <managed-bean-scope>session</managed-bean-scope>
        </managed-bean>
        <navigation-rule>
            <from-view-id>/index.xhtml</from-view-id>
            <navigation-case>
                <from-outcome>Registration Success</from-outcome>
                <to-view-id>/success.xhtml</to-view-id>
            </navigation-case>
        </navigation-rule>
</faces-config>

Il s'agit d'un fichier de configuration XML pour JavaServer Faces (JSF). Il contient des informations sur les managed beans et les règles de navigation utilisées dans une application web JSF.

Les éléments importants de ce fichier incluent :

En somme, ce fichier est utilisé pour configurer les beans gérés et les règles de navigation dans une application web JSF.

web.xml

<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="3.0" xmlns="https://jakarta.ee/xml/ns/jakartaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                                  https://jakarta.ee/xml/ns/jakartaee/web-facesconfig_3_0.xsd">
        <managed-bean>
            <managed-bean-name>studentBean</managed-bean-name>
            <managed-bean-class>me.yasser.atelier4.controllers.StudentController</managed-bean-class>
            <managed-bean-scope>session</managed-bean-scope>
        </managed-bean>
        <navigation-rule>
            <from-view-id>/index.xhtml</from-view-id>
            <navigation-case>
                <from-outcome>Registration Success</from-outcome>
                <to-view-id>/success.xhtml</to-view-id>
            </navigation-case>
        </navigation-rule>
</faces-config>

Il s'agit d'un fichier de configuration XML pour JavaServer Faces (JSF). Il contient des informations sur les managed beans et les règles de navigation utilisées dans une application web JSF.

Les éléments importants de ce fichier incluent :

En somme, ce fichier est utilisé pour configurer les beans gérés et les règles de navigation dans une application web JSF.


Resultat


Ressources


Made with Love 🦢

by @NBGamer